package router

import (
	"x-admin/backend/config"
	"x-admin/backend/internal/middleware"
	"x-admin/backend/internal/modules/auth"
	"x-admin/backend/internal/modules/permission"
	"x-admin/backend/internal/modules/role"
	"x-admin/backend/internal/modules/upload"
	"x-admin/backend/internal/modules/user"

	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	"gorm.io/gorm"
)

// Init 初始化路由
func Init(db *gorm.DB, cfg *config.Config) *gin.Engine {
	r := gin.New()

	// 中间件
	r.Use(gin.Recovery())
	r.Use(middleware.CORS())

	// 使用自定义日志中间件
	if cfg.Log.Environment == "development" {
		// 开发环境：详细的请求日志
		r.Use(middleware.RequestLoggerMiddleware())
	}
	// 错误日志中间件（所有环境）
	r.Use(middleware.ErrorLoggerMiddleware())
	// HTTP 请求日志中间件
	r.Use(middleware.LoggerMiddleware())

	// 静态文件服务
	r.Static("/uploads", cfg.Storage.LocalDir)

	// Swagger文档
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// 健康检查
	r.GET("/health", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"status": "ok",
			"app":    cfg.App.Name,
		})
	})

	// 注意：上传功能现在由upload模块处理，不再需要单独的存储管理器

	// API路由组
	api := r.Group("/admin-api/v1")
	{
		// 注册认证模块路由（包含需要认证和不需要认证的路由）
		auth.RegisterRoutes(api, db)

		// 需要认证的路由组
		protected := api.Group("/")
		protected.Use(middleware.AuthMiddleware())
		{
			// 注册用户管理模块路由
			user.RegisterRoutes(protected, db)

			// 注册角色管理模块路由
			role.RegisterRoutes(protected, db)

			// 注册权限管理模块路由
			permission.RegisterRoutes(protected, db)

			// 注册文件上传模块路由
			upload.RegisterRoutes(protected, db, cfg)

			// 🚀 自动注册生成的模块路由
			InitAutoRoutes(protected, db)
		}
	}

	return r
}

// 模块化路由架构说明
/*
X-Admin 模块化路由架构优势：

1. **代码组织清晰**：每个功能模块独立管理自己的路由
2. **依赖注入简化**：每个模块内部处理自己的依赖关系
3. **易于维护**：修改某个模块不会影响其他模块
4. **便于测试**：可以单独测试每个模块的路由
5. **支持插件化**：可以轻松添加或移除功能模块

核心模块：
- auth: 认证模块（登录、登出、用户信息、修改密码等）
- user: 用户管理模块（用户CRUD、重置密码等）
- role: 角色管理模块（角色CRUD、权限分配等）
- permission: 权限管理模块（权限CRUD、权限树等）
- upload: 文件上传模块（文件上传、管理、删除等）

每个模块包含：
- model.go: 数据模型和请求/响应结构体
- repository.go: 数据访问层
- service.go: 业务逻辑层
- handler.go: HTTP处理器
- router.go: 路由注册

使用方法：
在 main.go 中调用：r := router.InitModular(db, cfg)
*/
